<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.10">
<title>Spring Cloud 配置中心</title>
<style>
@import url(//fonts.googleapis.com/css?family=Titillium+Web:400,700);
@import url(//fonts.googleapis.com/css?family=Noticia+Text:400,400italic);
@import url(//cdnjs.cloudflare.com/ajax/libs/font-awesome/3.2.0/css/font-awesome.css);
/* Derived from the Riak documentation theme developed by Basho Technologies, Inc. | CC BY 3.0 License | https://docs.basho.org */
/* normalize.css v2.1.1 | MIT License | git.io/normalize */
/* ========================================================================== HTML5 display definitions ========================================================================== */
/** Correct `block` display not defined in IE 8/9. */
article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; }

/** Correct `inline-block` display not defined in IE 8/9. */
audio, canvas, video { display: inline-block; }

/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */
audio:not([controls]) { display: none; height: 0; }

/** Address styling not present in IE 8/9. */
[hidden] { display: none; }

/* ========================================================================== Base ========================================================================== */
/** 1. Prevent system color scheme's background color being used in Firefox, IE, and Opera. 2. Prevent system color scheme's text color being used in Firefox, IE, and Opera. 3. Set default font family to sans-serif. 4. Prevent iOS text size adjust after orientation change, without disabling user zoom. */
html { background: #fff; /* 1 */ color: #000; /* 2 */ font-family: sans-serif; /* 3 */ -ms-text-size-adjust: 100%; /* 4 */ -webkit-text-size-adjust: 100%; /* 4 */ }

/** Remove default margin. */
body { margin: 0; }

/* ========================================================================== Links ========================================================================== */
/** Address `outline` inconsistency between Chrome and other browsers. */
a:focus { outline: thin dotted; }

/** Improve readability when focused and also mouse hovered in all browsers. */
a:active, a:hover { outline: 0; }

/* ========================================================================== Typography ========================================================================== */
/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */
h1 { font-size: 2em; margin: 0.67em 0; }

/** Address styling not present in IE 8/9, Safari 5, and Chrome. */
abbr[title] { border-bottom: 1px dotted; }

/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */
b, strong { font-weight: bold; }

/** Address styling not present in Safari 5 and Chrome. */
dfn { font-style: italic; }

/** Address differences between Firefox and other browsers. */
hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }

/** Address styling not present in IE 8/9. */
mark { background: #ff0; color: #000; }

/** Correct font family set oddly in Safari 5 and Chrome. */
code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; }

/** Improve readability of pre-formatted text in all browsers. */
pre { white-space: pre-wrap; }

/** Set consistent quote types. */
q { quotes: "\201C" "\201D" "\2018" "\2019"; }

/** Address inconsistent and variable font size in all browsers. */
small { font-size: 80%; }

/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }

sup { top: -0.5em; }

sub { bottom: -0.25em; }

/* ========================================================================== Embedded content ========================================================================== */
/** Remove border when inside `a` element in IE 8/9. */
img { border: 0; }

/** Correct overflow displayed oddly in IE 9. */
svg:not(:root) { overflow: hidden; }

/* ========================================================================== Figures ========================================================================== */
/** Address margin not present in IE 8/9 and Safari 5. */
figure { margin: 0; }

/* ========================================================================== Forms ========================================================================== */
/** Define consistent border, margin, and padding. */
fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }

/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */
legend { border: 0; /* 1 */ padding: 0; /* 2 */ }

/** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */
button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ }

/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */
button, input { line-height: normal; }

/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */
button, select { text-transform: none; }

/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */
button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ }

/** Re-set default cursor for disabled elements. */
button[disabled], html input[disabled] { cursor: default; }

/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */
input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ }

/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */
input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; }

/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }

/** Remove inner padding and border in Firefox 4+. */
button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }

/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */
textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ }

/* ========================================================================== Tables ========================================================================== */
/** Remove most spacing between table cells. */
table { border-collapse: collapse; border-spacing: 0; }

*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }

html, body { font-size: 100%; }

body { background: white; color: #222222; padding: 0; margin: 0; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; }

a:hover { cursor: pointer; }

a:focus { outline: none; }

img, object, embed { max-width: 100%; height: auto; }

object, embed { height: 100%; }

img { -ms-interpolation-mode: bicubic; }

#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; }

.left { float: left !important; }

.right { float: right !important; }

.text-left { text-align: left !important; }

.text-right { text-align: right !important; }

.text-center { text-align: center !important; }

.text-justify { text-align: justify !important; }

.hide { display: none; }

.antialiased, body { -webkit-font-smoothing: antialiased; }

img { display: inline-block; vertical-align: middle; }

textarea { height: auto; min-height: 50px; }

select { width: 100%; }

p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; }

.subheader, #content #toctitle, .admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title, .tableblock > caption { line-height: 1.4; color: #3c3d3f; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; }

/* Typography resets */
div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; }

/* Default Link Styles */
a { color: #2984a9; text-decoration: underline; line-height: inherit; }
a:hover, a:focus { color: #faa94c; }
a img { border: none; }

/* Default paragraph styles */
p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 1.5; margin-bottom: 0.9375em; text-rendering: geometricPrecision; }
p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }

/* Default header styles */
h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: "Titillium Web", Verdana, Arial, sans-serif; font-weight: normal; font-style: normal; color: #616366; text-rendering: geometricPrecision; margin-top: 0.5em; margin-bottom: 0.5em; line-height: 1.2125em; }
h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #aeb0b2; line-height: 0; }

h1 { font-size: 2.125em; }

h2 { font-size: 1.6875em; }

h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; }

h4 { font-size: 1.125em; }

h5 { font-size: 1.125em; }

h6 { font-size: 1em; }

hr { border: solid #dddddd; border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; }

/* Helpful Typography Defaults */
em, i { font-style: italic; line-height: inherit; }

strong, b { font-weight: bold; line-height: inherit; }

small { font-size: 60%; line-height: inherit; }

code { font-family: monospace, serif; font-weight: normal; color: #515151; }

/* Lists */
ul, ol, dl { font-size: 1em; line-height: 1.5; margin-bottom: 0.9375em; list-style-position: outside; font-family: inherit; }

ul, ol { margin-left: 1.5em; }

/* Unordered Lists */
ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ }
ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; }
ul.square { list-style-type: square; }
ul.circle { list-style-type: circle; }
ul.disc { list-style-type: disc; }
ul.no-bullet { list-style: none; }

/* Ordered Lists */
ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; }

/* Definition Lists */
dl dt { margin-bottom: 0.3125em; font-weight: bold; }
dl dd { margin-bottom: 1.25em; }

/* Abbreviations */
abbr, acronym { text-transform: uppercase; font-size: 90%; color: #515151; border-bottom: 1px dotted #dddddd; cursor: help; }

abbr { text-transform: none; }

/* Blockquotes */
blockquote { margin: 0 0 0.9375em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; }
blockquote cite { display: block; font-size: inherit; color: #484a4c; }
blockquote cite:before { content: "\2014 \0020"; }
blockquote cite a, blockquote cite a:visited { color: #484a4c; }

blockquote, blockquote p { line-height: 1.5; color: #616366; }

/* Microformats */
.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #dddddd; padding: 0.625em 0.75em; }
.vcard li { margin: 0; display: block; }
.vcard .fn { font-weight: bold; font-size: 0.9375em; }

.vevent .summary { font-weight: bold; }
.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; }

@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; }
  h1 { font-size: 2.75em; }
  h2 { font-size: 2.3125em; }
  h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; }
  h4 { font-size: 1.4375em; } }
/* Print styles.  Inlined to avoid required HTTP connection: www.phpied.com/delay-loading-your-print-css/ Credit to Paul Irish and HTML5 Boilerplate (html5boilerplate.com)
*/
.print-only { display: none !important; }

@media print { * { background: transparent !important; color: #000 !important; /* Black prints faster: h5bp.com/s */ box-shadow: none !important; text-shadow: none !important; }
  a, a:visited { text-decoration: underline; }
  a[href]:after { content: " (" attr(href) ")"; }
  abbr[title]:after { content: " (" attr(title) ")"; }
  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
  pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
  thead { display: table-header-group; /* h5bp.com/t */ }
  tr, img { page-break-inside: avoid; }
  img { max-width: 100% !important; }
  @page { margin: 0.5cm; }
  p, h2, h3, #toctitle, .sidebarblock > .content > .title { orphans: 3; widows: 3; }
  h2, h3, #toctitle, .sidebarblock > .content > .title { page-break-after: avoid; }
  .hide-on-print { display: none !important; }
  .print-only { display: block !important; }
  .hide-for-print { display: none !important; }
  .show-for-print { display: inherit !important; } }
/* Tables */
table { background: #f1f1f1; margin-bottom: 1.25em; border: solid 5px white; }
table thead, table tfoot { background: #dfdfdf; font-weight: bold; }
table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: #222222; text-align: left; }
table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: #222222; }
table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #dfdfdf; }
table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.5; }

.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; }
.clearfix:after, .float-group:after { clear: both; }

*:not(pre) > code { font-size: 0.9em; padding: 0 3px; white-space: nowrap; background-color: #dfdfdf; border: 1px solid #c9c9c9; -webkit-border-radius: 4px; border-radius: 4px; text-shadow: none; }

pre, pre > code { line-height: 1.6; color: inherit; font-family: monospace, serif; font-weight: normal; }

kbd.keyseq { color: #848484; }

kbd:not(.keyseq) { display: inline-block; color: #515151; font-size: 0.75em; line-height: 1.4; background-color: #F7F7F7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; margin: -0.15em 0.15em 0 0.15em; padding: 0.2em 0.6em 0.2em 0.5em; vertical-align: middle; white-space: nowrap; }

kbd kbd:first-child { margin-left: 0; }

kbd kbd:last-child { margin-right: 0; }

.menuseq, .menu { color: #373737; }

p a > code:hover { color: #444444; }

#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; }
#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; }
#header:after, #content:after, #footnotes:after, #footer:after { clear: both; }

#header { margin-bottom: 2.5em; }
#header > h1 { color: #616366; font-weight: normal; border-bottom: 1px solid #dddddd; margin-bottom: -28px; padding-bottom: 32px; }
#header span { color: #616366; }
#header #revnumber { text-transform: capitalize; }
#header br { display: none; }
#header br + span { padding-left: 3px; }
#header br + span:before { content: "\2013 \0020"; }
#header br + span.author { padding-left: 0; }
#header br + span.author:before { content: ", "; }

#toc { border-bottom: 1px dashed #cccccc; padding-bottom: 1.25em; }
#toc > ul { margin-left: 0.25em; }
#toc ul.sectlevel0 > li > a { font-style: italic; }
#toc ul.sectlevel0 ul.sectlevel1 { margin-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; }
#toc ul { list-style-type: none; }

#toctitle { color: #3c3d3f; }

@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; }
  #toc.toc2 { position: fixed; width: 20em; left: 0; top: 0; border-right: 1px solid #cccccc; border-bottom: 0; z-index: 1000; padding: 1em; height: 100%; overflow: auto; }
  #toc.toc2 #toctitle { margin-top: 0; }
  #toc.toc2 > ul { font-size: .95em; }
  #toc.toc2 ul ul { margin-left: 0; padding-left: 1.25em; }
  #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; }
  body.toc2.toc-right { padding-left: 0; padding-right: 20em; }
  body.toc2.toc-right #toc.toc2 { border-right: 0; border-left: 1px solid #cccccc; left: auto; right: 0; } }
#content #toc { border-style: solid; border-width: 1px; border-color: #d9d9d9; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; border-width: 0; -webkit-border-radius: 4px; border-radius: 4px; }
#content #toc > :first-child { margin-top: 0; }
#content #toc > :last-child { margin-bottom: 0; }
#content #toc a { text-decoration: none; }

#content #toctitle { font-weight: bold; font-family: "Titillium Web", Verdana, Arial, sans-serif; font-size: 1em; padding-left: 0.125em; }

#footer { max-width: 100%; background-color: #515151; padding: 1.25em; }

#footer-text { color: #aeaeae; line-height: 1.35; }

.sect1 { padding-bottom: 1.25em; }

.sect1 + .sect1 { border-top: 1px dashed #cccccc; }

#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; width: 1em; margin-left: -1em; display: block; text-decoration: none; visibility: hidden; text-align: center; font-weight: normal; }
#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: '\00A7'; font-size: .85em; vertical-align: text-top; display: block; margin-top: 0.05em; }
#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; }
#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: #616366; text-decoration: none; }
#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #555659; }

.imageblock, .literalblock, .listingblock, .verseblock, .videoblock { margin-bottom: 1.25em; }

.admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .videoblock > .title, .listingblock > .title, .literalblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-align: left; font-weight: bold; }

.tableblock > caption { text-align: left; font-weight: bold; white-space: nowrap; overflow: visible; max-width: 0; }

table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; }

.admonitionblock > table { border: 0; background: none; width: 100%; }
.admonitionblock > table td.icon { text-align: center; width: 80px; }
.admonitionblock > table td.icon img { max-width: none; }
.admonitionblock > table td.icon .title { font-weight: bold; text-transform: uppercase; }
.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid #dddddd; color: #616366; }
.admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; }

.exampleblock > .content { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 4px; border-radius: 4px; }
.exampleblock > .content > :first-child { margin-top: 0; }
.exampleblock > .content > :last-child { margin-bottom: 0; }
.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6, .exampleblock > .content p { color: #333333; }
.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6 { line-height: 1; margin-bottom: 0.625em; }
.exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, .exampleblock > .content h3.subheader, .exampleblock > .content .subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, .exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, .exampleblock > .content h6.subheader { line-height: 1.4; }

.exampleblock.result > .content { -webkit-box-shadow: 0 1px 8px #d9d9d9; box-shadow: 0 1px 8px #d9d9d9; }

.sidebarblock { border-style: solid; border-width: 1px; border-color: #d9d9d9; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; -webkit-border-radius: 4px; border-radius: 4px; }
.sidebarblock > :first-child { margin-top: 0; }
.sidebarblock > :last-child { margin-bottom: 0; }
.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6, .sidebarblock p { color: #333333; }
.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6 { line-height: 1; margin-bottom: 0.625em; }
.sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > .subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, .sidebarblock h6.subheader { line-height: 1.4; }
.sidebarblock > .content > .title { color: #3c3d3f; margin-top: 0; line-height: 1.5; }

.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; }

.literalblock > .content pre, .listingblock > .content pre { background: url('./images/riak/pre-bg.jpg'); border-width: 0 0 1px 0; border-style: solid; border-color: #f0f0f0; -webkit-border-radius: 4px; border-radius: 4px; padding: 15px; word-wrap: break-word; }
.literalblock > .content pre.nowrap, .listingblock > .content pre.nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; }
.literalblock > .content pre > code, .listingblock > .content pre > code { display: block; }
@media only screen { .literalblock > .content pre, .listingblock > .content pre { font-size: 0.64em; } }
@media only screen and (min-width: 768px) { .literalblock > .content pre, .listingblock > .content pre { font-size: 0.72em; } }
@media only screen and (min-width: 1280px) { .literalblock > .content pre, .listingblock > .content pre { font-size: 0.8em; } }

.listingblock > .content { position: relative; }

.listingblock:hover code[class*=" language-"]:before { text-transform: uppercase; font-size: 0.9em; color: #999; position: absolute; top: 0.375em; right: 0.375em; }

.listingblock:hover code.asciidoc:before { content: "asciidoc"; }
.listingblock:hover code.clojure:before { content: "clojure"; }
.listingblock:hover code.css:before { content: "css"; }
.listingblock:hover code.groovy:before { content: "groovy"; }
.listingblock:hover code.html:before { content: "html"; }
.listingblock:hover code.java:before { content: "java"; }
.listingblock:hover code.javascript:before { content: "javascript"; }
.listingblock:hover code.python:before { content: "python"; }
.listingblock:hover code.ruby:before { content: "ruby"; }
.listingblock:hover code.scss:before { content: "scss"; }
.listingblock:hover code.xml:before { content: "xml"; }
.listingblock:hover code.yaml:before { content: "yaml"; }

.listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: #999; }

.listingblock.terminal pre .command:not([data-prompt]):before { content: '$'; }

table.pyhltable { border: 0; margin-bottom: 0; }

table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; }

table.pyhltable td.code { padding-left: .75em; padding-right: 0; }

.highlight.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #dddddd; }

.highlight.pygments .lineno { display: inline-block; margin-right: .25em; }

table.pyhltable .linenodiv { background-color: transparent !important; padding-right: 0 !important; }

.quoteblock { margin: 0 0 0.9375em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; }
.quoteblock blockquote { margin: 0 0 0.9375em 0; padding: 0 0 0.5625em 0; border: 0; }
.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
.quoteblock .attribution { margin-top: -.25em; padding-bottom: 0.5625em; font-size: inherit; color: #484a4c; }
.quoteblock .attribution br { display: none; }
.quoteblock .attribution cite { display: block; margin-bottom: 0.625em; }

table thead th, table tfoot th { font-weight: bold; }

table.tableblock.grid-all { border-collapse: separate; border-spacing: 1px; -webkit-border-radius: 4px; border-radius: 4px; border-top: 5px solid white; border-bottom: 5px solid white; }

table.tableblock.frame-topbot, table.tableblock.frame-none { border-left: 0; border-right: 0; }

table.tableblock.frame-sides, table.tableblock.frame-none { border-top: 0; border-bottom: 0; }

table.tableblock td .paragraph:last-child p, table.tableblock td > p:last-child { margin-bottom: 0; }

th.tableblock.halign-left, td.tableblock.halign-left { text-align: left; }

th.tableblock.halign-right, td.tableblock.halign-right { text-align: right; }

th.tableblock.halign-center, td.tableblock.halign-center { text-align: center; }

th.tableblock.valign-top, td.tableblock.valign-top { vertical-align: top; }

th.tableblock.valign-bottom, td.tableblock.valign-bottom { vertical-align: bottom; }

th.tableblock.valign-middle, td.tableblock.valign-middle { vertical-align: middle; }

p.tableblock.header { color: #222222; font-weight: bold; }

td > div.verse { white-space: pre; }

ol { margin-left: 1.75em; }

ul li ol { margin-left: 1.5em; }

dl dd { margin-left: 1.125em; }

dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; }

ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.46875em; }

ul.unstyled, ol.unnumbered, ul.checklist, ul.none { list-style-type: none; }

ul.unstyled, ol.unnumbered, ul.checklist { margin-left: 0.625em; }

ul.checklist li > p:first-child > i[class^="icon-check"]:first-child, ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; }

ul.checklist li > p:first-child > input[type="checkbox"]:first-child { position: relative; top: 1px; }

ul.inline { margin: 0 auto 0.46875em auto; margin-left: -1.375em; margin-right: 0; padding: 0; list-style: none; overflow: hidden; }
ul.inline > li { list-style: none; float: left; margin-left: 1.375em; display: block; }
ul.inline > li > * { display: block; }

.unstyled dl dt { font-weight: normal; font-style: normal; }

ol.arabic { list-style-type: decimal; }

ol.decimal { list-style-type: decimal-leading-zero; }

ol.loweralpha { list-style-type: lower-alpha; }

ol.upperalpha { list-style-type: upper-alpha; }

ol.lowerroman { list-style-type: lower-roman; }

ol.upperroman { list-style-type: upper-roman; }

ol.lowergreek { list-style-type: lower-greek; }

.hdlist > table, .colist > table { border: 0; background: none; }
.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; }

td.hdlist1 { padding-right: .8em; font-weight: bold; }

td.hdlist1, td.hdlist2 { vertical-align: top; }

.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }

.colist > table tr > td:first-of-type { padding: 0 .8em; line-height: 1; }
.colist > table tr > td:last-of-type { padding: 0.25em 0; }

.qanda > ol > li > p > em:only-child { color: #247494; }

.thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; -webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; }

.imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 1.25em 0; }
.imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 1.25em 0.625em; }
.imageblock > .title { margin-bottom: 0; }
.imageblock.thumb, .imageblock.th { border-width: 6px; }
.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; }

.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; }
.image.left { margin-right: 0.625em; }
.image.right { margin-left: 0.625em; }

a.image { text-decoration: none; }

span.footnote, span.footnoteref { vertical-align: super; font-size: 0.875em; }
span.footnote a, span.footnoteref a { text-decoration: none; }

#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; }
#footnotes hr { width: 20%; min-width: 6.25em; margin: -.25em 0 .75em 0; border-width: 1px 0 0 0; }
#footnotes .footnote { padding: 0 0.375em; line-height: 1.3; font-size: 0.875em; margin-left: 1.2em; text-indent: -1.2em; margin-bottom: .2em; }
#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; }
#footnotes .footnote:last-of-type { margin-bottom: 0; }

#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; }

.gist .file-data > table { border: none; background: #fff; width: 100%; margin-bottom: 0; }
.gist .file-data > table td.line-data { width: 99%; }

div.unbreakable { page-break-inside: avoid; }

.big { font-size: larger; }

.small { font-size: smaller; }

.underline { text-decoration: underline; }

.overline { text-decoration: overline; }

.line-through { text-decoration: line-through; }

.aqua { color: #00bfbf; }

.aqua-background { background-color: #00fafa; }

.black { color: black; }

.black-background { background-color: black; }

.blue { color: #0000bf; }

.blue-background { background-color: #0000fa; }

.fuchsia { color: #bf00bf; }

.fuchsia-background { background-color: #fa00fa; }

.gray { color: #606060; }

.gray-background { background-color: #7d7d7d; }

.green { color: #006000; }

.green-background { background-color: #007d00; }

.lime { color: #00bf00; }

.lime-background { background-color: #00fa00; }

.maroon { color: #600000; }

.maroon-background { background-color: #7d0000; }

.navy { color: #000060; }

.navy-background { background-color: #00007d; }

.olive { color: #606000; }

.olive-background { background-color: #7d7d00; }

.purple { color: #600060; }

.purple-background { background-color: #7d007d; }

.red { color: #bf0000; }

.red-background { background-color: #fa0000; }

.silver { color: #909090; }

.silver-background { background-color: #bcbcbc; }

.teal { color: #006060; }

.teal-background { background-color: #007d7d; }

.white { color: #bfbfbf; }

.white-background { background-color: #fafafa; }

.yellow { color: #bfbf00; }

.yellow-background { background-color: #fafa00; }

span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

.admonitionblock td.icon [class^="icon-"]:before { font-size: 2.5em; text-shadow: 0 0 8px white, 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #2984a9; color: #1f637f; }
.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; }
.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; }
.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; }
.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; }

.conum { display: inline-block; color: white !important; background-color: #515151; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; width: 20px; height: 20px; font-size: 12px; font-weight: bold; line-height: 20px; font-family: Arial, sans-serif; font-style: normal; position: relative; top: -2px; letter-spacing: -1px; }
.conum * { color: white !important; }
.conum + b { display: none; }
.conum:after { content: attr(data-value); }
.conum:not([data-value]):empty { display: none; }

body { background-image: url('./images/riak/body-bg.jpg'); }

::selection { background-color: #fcc07f; color: #fff; }

#header h1 { font-weight: bold; }

.literalblock > .content > pre, .listingblock > .content > pre { -webkit-box-shadow: inset 0 1px 4px #aeb9b6; box-shadow: inset 0 1px 4px #aeb9b6; -webkit-border-radius: 5px; border-radius: 5px; }

#content ul > li { list-style-type: square; }

p > em { font-family: 'Noticia Text', serif; font-weight: 400; font-size: 95%; }

.admonitionblock > table { width: 100%; background-image: url('./images/riak/info-bg.jpg'); border-collapse: separate; border-spacing: 0; -webkit-border-radius: 5px; border-radius: 5px; border: 1px solid #9EC6DF; }
.admonitionblock > table td.icon { padding: 15px; }
.admonitionblock > table td.icon .icon-tip:before { text-shadow: 0 0 20px white, 1px 1px 2px rgba(155, 155, 0, 0.8); }
.admonitionblock > table td.content { font-family: 'Noticia Text', italic; font-size: 90%; font-style: italic; border: 0; padding: 15px; }

.admonitionblock .literalblock > .content > pre, .admonitionblock .listingblock > .content > pre { background-image: url('./images/riak/info-bg.jpg'); }

.exampleblock > .content { background-color: transparent; border-color: #c9c9c9; }

.sidebarblock { background-image: url('./images/riak/sidebar-bg.jpg'); -webkit-border-radius: 5px; border-radius: 5px; }
.sidebarblock > .content > .title { color: #f1f1f1; text-shadow: 0px 2px 2px black; font-size: 1.25em; font-weight: bold; }
.sidebarblock > .content ul, .sidebarblock > .content p { color: #f1f1f1; text-shadow: 0px 1px 1px black; }
.sidebarblock > .content .title { color: #dfdfdf; }
.sidebarblock > .content code { color: #333; }
.sidebarblock > .content a { color: #60B5D8; }
.sidebarblock > .content a:hover { color: #FAA94C; }
.sidebarblock > .content .admonitionblock p, .sidebarblock > .content .admonitionblock ul { text-shadow: none; color: #616366; }

table.tableblock.grid-all { -webkit-border-radius: 0; border-radius: 0; -webkit-box-shadow: 0 1px 3px #999999; box-shadow: 0 1px 3px #999999; }

#footer { background-image: url('./images/riak/footer-bg.jpg'); padding: 25px 0; }

#footer-text { color: #fff; text-shadow: 1px 1px 1px #333; font-size: 80%; text-align: center; }

</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<!-- Generate a nice TOC -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery.tocify/1.9.0/javascripts/jquery.tocify.min.js"></script>
<!-- We do not need the tocify CSS because the asciidoc CSS already provides most of what we neeed -->

<style>
    .tocify ul {
        margin: 0;
    }

    .tocify-focus {
        color: #faa94c;
    }

    .tocify-focus > a {
        color: #faa94c;
    }

    .widgets {
        position: absolute;
        right: 0;
        top: 0;
        z-index: 9999;
    }
</style>
<a href='https://gitee.com/consolelog/docker-config-server-all-in-one' class="widgets" target="_blank">
    <img src='https://gitee.com/consolelog/docker-config-server-all-in-one/widgets/widget_1.svg' alt='Fork me on Gitee'/>
</a>
<script type="text/javascript">
    $(function () {
        // Add a new container for the tocify toc into the existing toc so we can re-use its
        // styling
        $("#toc").append("<div id='generated-toc'></div>");
        $("#generated-toc").tocify({
            extendPage: true,
            context: "#content",
            highlightOnScroll: true,
            hideEffect: "slideUp",
            // Use the IDs that asciidoc already provides so that TOC links and intra-document
            // links are the same. Anything else might confuse users when they create bookmarks.
            hashGenerator: function (text, element) {
                return $(element).attr("id");
            },
            // Smooth scrolling doesn't work properly if we use the asciidoc IDs
            smoothScroll: false,
            // Set to 'none' to use the tocify classes
            theme: "none",
            // Handle book (may contain h1) and article (only h2 deeper)
            selectors: $("#content").has("h1").size() > 0 ? "h1,h2,h3,h4,h5" : "h2,h3,h4,h5",
            ignoreSelector: ".discrete"
        });

        // Switch between static asciidoc toc and dynamic tocify toc based on browser size
        // This is set to match the media selectors in the asciidoc CSS
        // Without this, we keep the dynamic toc even if it is moved from the side to preamble
        // position which will cause odd scrolling behavior
        var handleTocOnResize = function () {
            if ($(document).width() < 768) {
                $("#generated-toc").hide();
                $(".sectlevel0").show();
                $(".sectlevel1").show();
            } else {
                $("#generated-toc").show();
                $(".sectlevel0").hide();
                $(".sectlevel1").hide();
            }
        }

        $(window).resize(handleTocOnResize);
        handleTocOnResize();
    });
</script>
</head>
<body class="article toc2 toc-left">
<div id="header">
<h1>Spring Cloud 配置中心</h1>
<div id="toc" class="toc2">
<div id="toctitle">目录</div>
<ul class="sectlevel1">
<li><a href="#_快速开始">1. 快速开始</a></li>
<li><a href="#_功能介绍">2. 功能介绍</a>
<ul class="sectlevel2">
<li><a href="#project_manage">2.1. 项目管理</a></li>
<li><a href="#env_manage">2.2. 环境管理</a></li>
<li><a href="#conf_manage">2.3. 配置管理</a></li>
<li><a href="#app_manage">2.4. 应用管理</a></li>
<li><a href="#client_connect">2.5. 连接到配置中心</a>
<ul class="sectlevel3">
<li><a href="#url_read_config">2.5.1. URL方式读取配置</a></li>
<li><a href="#discovery_read_config">2.5.2. 注册发现方式读取配置</a></li>
</ul>
</li>
<li><a href="#notice_manage">2.6. 推送通知</a></li>
<li><a href="#keyboard_shortcut">2.7. 快捷键</a></li>
</ul>
</li>
<li><a href="#_附录">3. 附录</a>
<ul class="sectlevel2">
<li><a href="#backend_appendix">3.1. 附录：后端参数</a></li>
<li><a href="#_附录前端参数">3.2. 附录：前端参数</a></li>
</ul>
</li>
<li><a href="#_源码地址">4. 源码地址</a></li>
<li><a href="#_开源协议">5. 开源协议</a></li>
<li><a href="#_更新日志">6. 更新日志</a></li>
<li><a href="#contribution">7. 贡献指南</a></li>
</ul>
</div>
</div>
<div id="content">
<div class="sect1">
<h2 id="_快速开始">1. 快速开始</h2>
<div class="sectionbody">
<div class="paragraph">
<p>本项目最快的启动方式就是使用 <a href="https://docs.docker.com"><code>docker</code></a> 以及 <code>docker</code> 官方提供的 <a href="https://docs.docker.com/compose/"><code>docker-compose</code></a> 。</p>
</div>
<div class="paragraph">
<p>前往仓库 <a href="https://gitee.com/consolelog/docker-config-server-all-in-one" class="bare">https://gitee.com/consolelog/docker-config-server-all-in-one</a> 中下载 <a href="https://gitee.com/consolelog/docker-config-server-all-in-one/raw/master/docker-compose.yml"><code>docker-compose.yml</code></a> 以及 <a href="https://gitee.com/consolelog/docker-config-server-all-in-one/raw/master/schema.sql"><code>schema.sql</code></a> 两个文件</p>
</div>
<div class="paragraph">
<p>将这两个文件放到同一个目录中，并执行 <code>docker-compose up -d</code> 命令启动服务</p>
</div>
<div class="paragraph">
<p>启动后即可通过 <a href="http://localhost" class="bare">http://localhost</a> 地址访问并管理配置中心了</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
如果您熟悉Spring Cloud 以及 NodeJS ，也可以直接拉取本项目的前后端源代码来启动
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_功能介绍">2. 功能介绍</h2>
<div class="sectionbody">
<div class="paragraph">
<p>目前支持功能:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="#project_manage">项目管理</a></p>
</li>
<li>
<p><a href="#env_manage">环境管理</a></p>
</li>
<li>
<p><a href="#conf_manage">配置管理</a></p>
</li>
<li>
<p><a href="#app_manage">应用管理</a></p>
</li>
<li>
<p><a href="#notice_manage">推送通知</a></p>
</li>
<li>
<p><a href="#client_connect">连接到配置中心</a></p>
</li>
<li>
<p><a href="#keyboard_shortcut">快捷键</a></p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="project_manage">2.1. 项目管理</h3>
<div class="paragraph">
<p>项目管理是为了满足多项目共用同一配置中心而开发的。</p>
</div>
<div class="paragraph">
<p>由于 <a href="#env_manage">环境管理</a> 、 <a href="#conf_manage">配置管理</a> 、 <a href="#app_manage">应用管理</a> 、<a href="#notice_manage">推送通知</a> 功能都是基于 <code>项目</code> 衍生出来的管理模块，需要依赖项目，所以进入配置中心首先就要创建项目，并设置当前项目。</p>
</div>
<div class="paragraph">
<p>项目名只作为备注使用，便于使用者查看，可以使用中文，甚至都没有加入重复校验。</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
项目编号只能是数字、字母和英文半角符号的减号(<code>-</code>)，并且第一个字符必须是英文（其它编号也是如此），目的是为了满足SpringCloudConfig默认的规则，避免出现识别错误BUG。
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="env_manage">2.2. 环境管理</h3>
<div class="paragraph">
<p>环境管理用来区分同一项目中不通的运行环境，例如 <code>本地开发环境</code>、<code>本地测试环境</code>、<code>用户测试环境</code>、<code>生产环境</code> 等。</p>
</div>
<div class="paragraph">
<p>环境名只作为备注使用，便于使用者查看，可以使用中文，甚至都没有加入重复校验。</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
环境编号只能是数字、字母和英文半角符号的减号(<code>-</code>)，并且第一个字符必须是英文（其它编号也是如此），目的是为了满足SpringCloudConfig默认的规则，避免出现识别错误BUG。
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="conf_manage">2.3. 配置管理</h3>
<div class="paragraph">
<p>配置就是应用最终使用的参数项，在客户端应用成功连接到配置中心后，即可读取配置中心中配置好的参数。</p>
</div>
<div class="paragraph">
<p>配置和应用的关系是多对多的，并非一个应用只能读取一个配置，而是可以读取多个。例如 <code>测试应用1</code> 可以同时读取 <code>测试应用1专用配置</code> 和 <code>测试环境数据库通用配置</code> 两个配置。它们之间通过应用详情页面进行关联，没有关联的配置不会被应用读取到。</p>
</div>
</div>
<div class="sect2">
<h3 id="app_manage">2.4. 应用管理</h3>
<div class="paragraph">
<p>应用就是实际开发中编写代码的服务模块，既可以是单体应用也可以是微服务中的某个服务。</p>
</div>
<div class="paragraph">
<p>应用名只作为备注使用，便于使用者查看，可以使用中文，甚至都没有加入重复校验。</p>
</div>
<div class="paragraph">
<p>应用和配置的关系是多对多的，并非一个应用只能读取一个配置，而是可以读取多个。例如 <code>测试应用1</code> 可以同时读取 <code>测试应用1专用配置</code> 和 <code>测试环境数据库通用配置</code> 两个配置。它们之间通过应用详情页面进行关联，没有关联的配置不会被应用读取到。</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
应用编号只能是数字、字母和英文半角符号的减号(<code>-</code>)，并且第一个字符必须是英文（其它编号也是如此），目的是为了满足SpringCloudConfig默认的规则，避免出现识别错误BUG。
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="client_connect">2.5. 连接到配置中心</h3>
<div class="paragraph">
<p>配置中心是负责管理参数的，而这些参数真正的使用者是客户端。</p>
</div>
<div class="paragraph">
<p>要想连接到配置中心，客户端首先需要添加依赖:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-xml" data-lang="xml">&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-starter-config&lt;/artifactId&gt;
&lt;/dependency&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>然后还需要添加 <code>bootstrap.properties</code> （或 <code>bootstrap.yml</code> ） 文件，指定读取配置的方式。</p>
</div>
<div class="paragraph">
<p>读取配置的方式支持两种:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="#url_read_config">URL方式读取配置</a></p>
</li>
<li>
<p><a href="#discovery_read_config">注册发现方式读取配置</a></p>
</li>
</ul>
</div>
<div class="sect3">
<h4 id="url_read_config">2.5.1. URL方式读取配置</h4>
<div class="paragraph">
<p>默认情况下，配置中心采用的是URL的方式读取配置。</p>
</div>
<div class="paragraph">
<p>这种方式下，客户端直接通过URL读取配置中心的参数，以下是 <code>bootstrap.properties</code> 的示例：</p>
</div>
<div class="listingblock">
<div class="title">bootstrap.properties</div>
<div class="content">
<pre class="highlight"><code class="language-properties" data-lang="properties">spring.cloud.config.uri=http://localhost/api/config-server <i class="conum" data-value="1"></i><b>(1)</b>
spring.application.name=TestProject_TestApp <i class="conum" data-value="2"></i><b>(2)</b>
spring.profiles.active=TestEnv <i class="conum" data-value="3"></i><b>(3)</b></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>配置中心URL</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>项目编号_应用编号</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>环境编号</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="discovery_read_config">2.5.2. 注册发现方式读取配置</h4>
<div class="paragraph">
<p>在微服务架构中，两个服务注册到同一个注册/发现中心时，即可通过注册中心获取调用地址。</p>
</div>
<div class="paragraph">
<p>这时候，可以设置配置中心的参数 <code>DISCOVERY_TYPE</code> 为对应的注册中心，并设置对应的连接信息，例如：</p>
</div>
<div class="listingblock">
<div class="title">docker-compose.yml</div>
<div class="content">
<pre class="highlight"><code class="language-yaml" data-lang="yaml">...
DISCOVERY_TYPE: eureka
EUREKA_SERVICE_URL: http://admin:admin@localhost:8761/eureka/</code></pre>
</div>
</div>
<div class="paragraph">
<p>此时配置中心即可注册到注册中心，客户端也需要注册到同一个注册中心，并通过服务名读取配置中心中的参数：</p>
</div>
<div class="listingblock">
<div class="title">bootstrap.properties</div>
<div class="content">
<pre class="highlight"><code class="language-properties" data-lang="properties">spring.application.name=TestProject_TestApp <i class="conum" data-value="1"></i><b>(1)</b>
spring.profiles.active=TestEnv <i class="conum" data-value="2"></i><b>(2)</b>
spring.cloud.config.discovery.enable=true <i class="conum" data-value="3"></i><b>(3)</b>
spring.cloud.config.discovery.service-id=config-server <i class="conum" data-value="4"></i><b>(4)</b>
eureka.client.service-url.defaultZone=http://admin:admin@localhost:8761/eureka/ <i class="conum" data-value="5"></i><b>(5)</b></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>项目编号_应用编号</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>环境编号</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>开启注册中心读取配置</td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td>配置中心的的服务名</td>
</tr>
<tr>
<td><i class="conum" data-value="5"></i><b>5</b></td>
<td>注册中心地址</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect2">
<h3 id="notice_manage">2.6. 推送通知</h3>
<div class="paragraph">
<p>在开发中有时候需要在运行(runtime)期间动态的调整某些参数，这时就可以使用推送通知功能。</p>
</div>
<div class="paragraph">
<p>推送通知功能使用rabbitmq队列，在使用推送通知功能之前需要预先通过 <code>MONITOR_TYPE</code> 参数（<a href="#backend_appendix">附录：后端参数</a>）开启推送通知功能，默认情况下 <code>MONITOR_TYPE</code> 的值为 <code>none</code>，即不开启推送通知功能。我们需要将之设置为 <code>rabbitmq</code> 即可开启。</p>
</div>
<div class="paragraph">
<p>开启推送通知功能后，接下来需要配置客户端。</p>
</div>
<div class="paragraph">
<p>客户端首先需要添加推送依赖:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-xml" data-lang="xml">&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-starter-bus-amqp&lt;/artifactId&gt;
&lt;/dependency&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>还需要设置 rabbitmq 连接参数，我们需要将配置中心和客户端连接到同一个 <code>Exchange</code> 中，这样才能接收到配置中心推送的通知，默认情况下配置中心使用 <code>config-server-exchange</code> 作为 <code>Exchange</code> 名称。</p>
</div>
<div class="paragraph">
<p>示例配置：</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-properties" data-lang="properties">spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.cloud.stream.bindings.springCloudBusOutput.destination=config-server-exchange
spring.cloud.stream.bindings.springCloudBusInput.destination=config-server-exchange</code></pre>
</div>
</div>
<div class="paragraph">
<p>这些配置也可以在配置中心中提前配置好，然后将它和应用进行关联。</p>
</div>
<div class="paragraph">
<p>最后还需要加入 <code>@RefreshScope</code> 注解，该注解可以标记任意 <code>Bean</code> ，之后该 bean 就会加入到运行期间自动刷新的生命周期中。</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<code>@RefreshScope</code> 可能会导致 bean 重新实例化，出现BUG时请参考这一点解决。
</td>
</tr>
</table>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
许多启动时读取的参数无法通过推送通知动态的改变，例如 <code>server.port</code> 。这些参数需要重启服务来使之生效
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="keyboard_shortcut">2.7. 快捷键</h3>
<div class="paragraph">
<p>为了方便快速管理配置中心，于是加入了快捷键功能。</p>
</div>
<div class="paragraph">
<p>以下为一些常用快捷键的列表，更多快捷键请在配置中心中的任意页面按下 <code>?</code> 建查看提示：</p>
</div>
<table class="tableblock frame-all grid-all fit-content">
<caption class="title">Table 1. 常用快捷键列表</caption>
<colgroup>
<col>
<col>
<col>
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">快捷键</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">说明</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">备注</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Alt+0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">跳转到 <code>项目列表</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Alt+1</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">跳转到 <code>应用列表</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Alt+2</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">跳转到 <code>环境列表</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Alt+3</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">跳转到 <code>配置列表</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Alt+4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">跳转到 <code>通知列表</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Alt+N</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">跳转到 <code>新建页面</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">例如在 <code>项目列表</code> 页面使用，就可以跳转到 <code>新建项目</code> 页面，某些页面可以没有该快捷键</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Alt+L</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">跳转到 <code>列表页面</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">例如在 <code>新建项目</code> 页面使用，就可以跳转到 <code>项目列表</code> 页面，某些页面可以没有该快捷键</p></td>
</tr>
</tbody>
</table>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
在 <code>MacOS</code> 系统下，使用 <code>Option</code> 代替 <code>alt</code>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_附录">3. 附录</h2>
<div class="sectionbody">
<div class="paragraph">
<p>快速开始中使用的镜像，本质上就是提取前后端镜像中的业务代码，打包成一个新的镜像。 所以后端的配置同样可以套用到快速开始中。</p>
</div>
<div class="paragraph">
<p>后端使用了 <code>SpringBoot 2.3.1.RELEASE</code>、 <code>SpringCloud Hoxton.SR5</code> 版本开发，数据库使用的是 <code>MySQL</code>，注册中心支持 <code>Eureka</code> 和 <code>Consul</code>，推送通知队列使用的时 <code>RabbitMQ</code>。如果没有满足您的需求，可以在 <a href="#contribution">贡献指南</a> 中查看并提交issues或自行修改。</p>
</div>
<div class="paragraph">
<p>前端使用了 <a href="https://angular.cn/">Angular 9</a> 、 <a href="https://ng.ant.design/">NG-ZORRO</a>， 以及 <a href="https://github.com/brtnshrdr/angular2-hotkeys#readme">angular2-hotkeys</a> 、 <a href="https://lodash.com/">lodash</a> 等。</p>
</div>
<div class="sect2">
<h3 id="backend_appendix">3.1. 附录：后端参数</h3>
<table class="tableblock frame-all grid-all fit-content">
<caption class="title">Table 2. 后端支持参数</caption>
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">参数名</th>
<th class="tableblock halign-left valign-top">默认值</th>
<th class="tableblock halign-left valign-top">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">SERVER_PORT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8888</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">后端暴露的端口</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MYSQL_HOST</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">localhost</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">数据库地址</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MYSQL_PORT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">3306</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">数据库端口号</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MYSQL_DATABASE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">application_configuration</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">数据库名</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MYSQL_USERNAME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">root</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">数据库登录名</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MYSQL_PASSWORD</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">root</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">数据库登录密码</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">APPLICATION_NAME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">config-server</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">SpringBoot中的 <code>spring.application.name</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">LOG_LEVEL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">info</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">SpringBoot中的 <code>logging.level</code>，设置为 <code>debug</code> 会显示详情(包含SQL)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">DISCOVERY_TYPE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">url</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">注册中心类型，<code>url/eureka/consul</code>，其中 url 表示不使用注册中心</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CONSUL_TOKEN</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">B595BC8E-DE44-4510-82D7-ECF5657F4D4D</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">当 DISCOVERY_TYPE 为 <code>consul</code> 时生效，表示 consul的 <code>acl_token</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CONSUL_HOST</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8500</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">当 DISCOVERY_TYPE 为 <code>consul</code> 时生效，表示 consul的地址</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">CONSUL_PORT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8500</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">当 DISCOVERY_TYPE 为 <code>consul</code> 时生效，表示 consul的端口号</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">EUREKA_SERVICE_URL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="http://admin:admin@localhost:8761/eureka/" class="bare">http://admin:admin@localhost:8761/eureka/</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">当 DISCOVERY_TYPE 为 <code>eureka</code> 时生效，表示 eureka 的注册地址</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">MONITOR_TYPE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">none</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">通知推送类型，<code>none/rabbitmq</code>，其中 none 表示不使用通知推送功能</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">RABBITMQ_HOST</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">localhost</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">当 MONITOR_TYPE 为 <code>rabbitmq</code> 时生效，表示 rabbitmq 的地址</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">RABBITMQ_PORT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">5672</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">当 MONITOR_TYPE 为 <code>rabbitmq</code> 时生效，表示 rabbitmq 的端口号</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">RABBITMQ_USERNAME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">admin</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">当 MONITOR_TYPE 为 <code>rabbitmq</code> 时生效，表示 rabbitmq 的用户名</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">RABBITMQ_PASSWORD</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">admin</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">当 MONITOR_TYPE 为 <code>rabbitmq</code> 时生效，表示 rabbitmq 的密码</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">RABBITMQ_EXCHANGE_NAME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">config-server-exchange</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">当 MONITOR_TYPE 为 <code>rabbitmq</code> 时生效，表示 rabbitmq 的交换机名称</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_附录前端参数">3.2. 附录：前端参数</h3>
<table class="tableblock frame-all grid-all fit-content">
<caption class="title">Table 3. 前端支持参数</caption>
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">参数名</th>
<th class="tableblock halign-left valign-top">默认值</th>
<th class="tableblock halign-left valign-top">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">BACKEND_PATH</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="http://config:8888" class="bare">http://config:8888</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Nginx中反向代理的后端地址</p></td>
</tr>
</tbody>
</table>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
注意这个参数在快速启动中不生效，因为前后端使用的是同一个容器，所以固定为 <a href="http://localhost:8888" class="bare">http://localhost:8888</a>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_源码地址">4. 源码地址</h2>
<div class="sectionbody">
<div class="paragraph">
<p>源码托管在 <a href="https://gitee.com">Gitee</a> 中：</p>
</div>
<div class="paragraph">
<p><a href="https://gitee.com/consolelog/codeforfun-config-server-frontend">Gitee-配置中心-前端</a>、
<a href="https://gitee.com/consolelog/codeforfun-config-server">Gitee-配置中心-后端</a>、
<a href="https://gitee.com/consolelog/docker-config-server-all-in-one">Gitee配置中心-快速启动</a></p>
</div>
<div class="paragraph">
<p>同时也提供了 <a href="https://github.com/">Github</a> 地址作为备用：</p>
</div>
<div class="paragraph">
<p><a href="https://github.com/qq253498229/codeforfun-config-frontend">Github-配置中心-前端</a>、
<a href="https://github.com/qq253498229/codeforfun-config-server">Github-配置中心-后端</a>、
<a href="https://github.com/qq253498229/docker-config-server-all-in-one">Gitee配置中心-快速启动</a></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_开源协议">5. 开源协议</h2>
<div class="sectionbody">
<div class="paragraph">
<p>本项目遵循 MIT 协议，虽然我也不知道这个协议具体是啥意思，但是原则上你可以随便使用本项目，当然前提是不触犯法律: <a href="http://xingfa.org/">中华人民共和国刑法</a> 、 <a href="https://paperclip.feishu.cn/file/boxcnZGTyENVDRcBIRUlFtM0YVf">中华人民共和国民法典(草案)</a>。</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_更新日志">6. 更新日志</h2>
<div class="sectionbody">
<div class="paragraph">
<p>懒得写了，以后再说吧</p>
</div>
<div class="paragraph">
<p><a href="https://gitee.com/consolelog/codeforfun-config-server/commits/master">后端提交记录</a></p>
</div>
<div class="paragraph">
<p><a href="https://gitee.com/consolelog/codeforfun-config-server-frontend/commits/master">前端提交记录</a></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="contribution">7. 贡献指南</h2>
<div class="sectionbody">
<div class="paragraph">
<p>你可以在 <a href="https://gitee.com/consolelog/codeforfun-config-server-frontend/issues">前端</a> 、 <a href="https://gitee.com/consolelog/codeforfun-config-server/issues">后端</a> 以及 <a href="https://gitee.com/consolelog/docker-config-server-all-in-one/issues">快速启动</a> 的 issues 列表中提交 issue。</p>
</div>
<div class="paragraph">
<p>同时您也可以提供 PullRequest 贡献代码。</p>
</div>
</div>
</div>
</div>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  messageStyle: "none",
  tex2jax: {
    inlineMath: [["\\(", "\\)"]],
    displayMath: [["\\[", "\\]"]],
    ignoreClass: "nostem|nolatexmath"
  },
  asciimath2jax: {
    delimiters: [["\\$", "\\$"]],
    ignoreClass: "nostem|noasciimath"
  },
  TeX: { equationNumbers: { autoNumber: "none" } }
})
MathJax.Hub.Register.StartupHook("AsciiMath Jax Ready", function () {
  MathJax.InputJax.AsciiMath.postfilterHooks.Add(function (data, node) {
    if ((node = data.script.parentNode) && (node = node.parentNode) && node.classList.contains('stemblock')) {
      data.math.root.display = "block"
    }
    return data
  })
})
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_HTMLorMML"></script>
</body>
</html>